As complicated as neccessary and no more. I forget who said that but I certainly agree. I write code in an Object Oriented style. For the most part when my user interface, the web site, interacts with my business objects, it will create an instance of the business object and interact with its properties and methods. In the data layer, by contrast you will see all static methods which it seems like I read is a called the facade pattern. Its purpose is to abstract the underlying database entirely away from the business layer. This allows one to create data layers for multiple database platforms.
I generate much of the code in the business and data layer which saves enormous time on typical CRUD (Create, Retrieve, Update, Delete) operations. I always review the generated code and usually have to customize it if I need something other than basic CRUD. I use CodeSmith Studio which is like using ASP.NET to generate your code including anything from stored procedures to user interfaces based on the database schema. I wrote my own scripts so I can point it at my MS SQL database and generate a corresponding data layer for MySQL, PostgreSql, Firebird Sql, or SQLite. I choose not to use any OR Mapper in mojoPortal for a number of reasons.