I've been looking for ways to do this myself, and the conclusion I came to is that caching prepared statements yourself tends to lead to fights with the borrow-checker, and the prepare_cached() exists for this exact reason.
Unfortunately, if I recall correctly, it matches them on the query string, which is kind of sub-optimal. Someone(tm) should add an option to allow it to store prepared statements in an hashmap instead, key'd on integer values that are allocated and returned to the application.